package com.lazily.innerclass;


/**
 * @Author: GZQ
 * @date: 2025/2/16 13:06
 * @description: 静态内部类的使用
 */

public class StaticInnerClass01 {

	// 程序入口
	public static void main(String[] args) {
		Outer07 outer07 = new Outer07();
		outer07.m1();

		// 外部其他类 使用静态内部类
		// 方式一
		// 因为静态内部类, 是可以通过类名直接访问(前提是满足访问权限)
		Outer07.Inner07 inner07 = new Outer07.Inner07();
		inner07.say();
		// 方式二
		// 编写一个方法，可以返回静态内部类的对象实例。
		Outer07.Inner07 inner8 = outer07.getInner07();
		System.out.println("=========");
		inner8.say();
		// 方式三
		Outer07.Inner07 inner9 = outer07.getInner07_();
		System.out.println("************");
		inner9.say();
	}
}

class Outer07 { // 外部类
	private int n1 = 10;
	private static String name = "张三";

	private static void cry() {
	}

	// Inner10就是静态内部类
	// 1. 放在外部类的成员位置
	// 2. 使用static 修饰
	// 3. 可以直接访问外部类的所有静态成员, 包含私有的, 但不能直接访问非静态成员。
	// 4. 可以添加任意的访问修饰符(public、protected、默认、private), 因为它的地位就是一个成员
	// 5. 作用域：同其他的成员，为一个整体
	static class Inner07 {
		private static String name = "李四";
		public void say() {
			//如果外部类和静态内部类的成员重名时，静态内部类访问的时，
			//默认遵循就近原则，如果想访问外部类的成员，则可以使用 （外部类名.成员）
			System.out.println((name + " 外部类 name= " + Outer07.name));
			cry();
		}
	}

	public void m1() {
		Inner07 inner07 = new Inner07();
		inner07.say();
	}

	public Inner07 getInner07() {
		return new Inner07();
	}

	public static Inner07 getInner07_() {
		return new Inner07();
	}
}

// 小结：
// (1) 内部类有四种 局部内部类，匿名内部类，成员内部类，静态内部类
/*
   (2) 重点还是掌握 匿名内部类使用 new 类/接口(参数列表) ｛
		....
};
* */
// (3) 成员内部类, 静态内部类 是放在外部类的成员位置, 本质就是一个成员。